home *** CD-ROM | disk | FTP | other *** search
- #include "global.h"
- #include "edit.h"
- #include "file.h"
- #include "icon.h"
- #include "menu.h"
- #include "obj.h"
- #include "rsc.h"
- #include "scroll.h"
- #include "tasten.h"
- #include "text.h"
- #include "windows.h"
- #include "kurzel.h"
-
- /*
- * Exportierte Variablen
- */
- BOOLEAN krz_loaded;
-
- /**************************************************************************/
-
-
- #define MNAME_LEN 15
- #define KRZ_MAX_LEN 8
-
- typedef struct
- {
- UBYTE name[MNAME_LEN+1];
- PATH file;
- LONG y;
- WORD x;
- }MARKE, *MARKEP;
-
- #define KRZ_LEN(col) (TEXT(col)[0])
- #define KRZ_TXT(col) (TEXT(col)+1)
- #define ERSATZ(col) (TEXT(col)+1+KRZ_MAX_LEN+1)
-
- LOCAL RING kurz;
- /* Sortierte Zeilen */
- /* Am Anfang in umgedrehter Reihenfolge die Zeichen */
- /* des Kürzel als Null-Terminierender String */
- /* davor noch die länge des Kürzel (Pascalähnlich) */
- /* 0 Kürzellänge, 1-9 Kürzel, ab der 10 Position der Ersatzstring */
- LOCAL RING auto_kurz;
- LOCAL MARKE Marken[5];
-
- LOCAL PATH krz_name; /* Name der aktuellen Kürzeldatei, oder leer */
-
- /***************************************************************************/
- LOCAL VOID go_to_marke(WORD nr);
-
- LOCAL WORD load_kurzel (VOID);
- LOCAL VOID clr_kurzel (VOID);
- LOCAL WORD add_kurzel (LINEP col);
-
- /***************************************************************************/
-
- BOOLEAN goto_line_dial (VOID)
- {
- WORD antw;
- UBYTE s[12];
-
- objc_setstring(pos, GZEILE, "");
-
- Arrow_mouse();
- antw = HndlDial(pos, 0, FALSE, NULL, NULL);
- Last_mouse();
- objc_getstring(pos, GZEILE, s);
- if (antw == GOK && *s)
- {
- desire_x = 0;
- desire_y = atol(s)-1;
- return TRUE;
- }
- return FALSE;
- } /* mgoto */
-
- /***************************************************************************/
- /* Verwaltung der Marken */
- /***************************************************************************/
-
- VOID del_marke(WORD nr)
- {
- MARKEP m;
- UBYTE *str;
- WORD len;
-
- if (nr>=0 && nr<=4)
- {
- m = Marken + nr;
- m->file[0] = EOS;
- m->name[0] = EOS;
- str = menu[MMARKE1+nr].ob_spec.free_string + 5;
- len = MNAME_LEN;
- while ((--len)>=0)
- *str++ = ' ';
- }
- }
-
- VOID set_marke(WORD nr, CONST UBYTE *name, PATH file, LONG y, WORD x)
- {
- MARKEP m;
- UBYTE n[MNAME_LEN+1];
-
- if (nr>=0 && nr<=4)
- {
- m = Marken+nr;
- m->x = x;
- m->y = y;
- *(UBYTE*)COPYB(n,name,MNAME_LEN) = EOS;
- strcpy(m->name, n);
- strcpy(m->file, file);
- if (n[0]==EOS)
- file_name(m->file, n, FALSE);
- fillup_menu(MMARKE1 + nr, n, 5);
- }
- }
-
- VOID get_marke(WORD nr, UBYTE *name, PATH file, LONG *y, WORD *x)
- {
- if (nr>=0 && nr<=4)
- {
- MARKEP m;
-
- m = Marken+nr;
- *x = m->x;
- *y = m->y;
- strcpy(name,m->name);
- strcpy(file,m->file);
- }
- else
- {
- name[0] = EOS;
- file[0] = EOS;
- }
- }
-
- VOID init_marken(VOID)
- {
- WORD i;
- MARKEP m;
-
- for (i=5,m=Marken; (--i)>=0; m++)
- {
- m->file[0] = EOS;
- m->name[0] = EOS;
- }
- init_textring(&kurz);
- init_textring(&auto_kurz);
- }
-
- VOID goto_marke(WORD nr)
- {
- PATH file;
- UBYTE name[12];
- LONG y;
- WORD x, icon;
-
- if (global_shift)
- del_marke(nr);
- else
- {
- get_marke(nr,name,file,&y,&x);
- if (file[0]!=EOS)
- {
- icon = still_loaded(file);
- if (icon<0)
- icon = load_edit(file,FALSE,-1,-1,NULL);
- if (icon>=0)
- {
- if (do_icon(icon,DO_OPEN)<0)
- note(1, NOWINDOW);
- desire_y = y;
- desire_x = x;
- Icon_edit(icon,DO_GOTO);
- }
- }
- }
- }
-
- VOID config_marken(TEXTP t_ptr)
- {
- WORD antw;
- PATH file;
- UBYTE name[14];
- LONG y;
- WORD x, i;
-
- select_objc(marken, MRK1, TRUE);
- for (i=1; i<5; i++)
- select_objc(marken, MRK1+i, FALSE);
- for (i=0; i<5; i++)
- {
- get_marke(i, name, file, &y, &x);
- objc_setstring(marken, MRKTXT1+i, name);
- }
- Arrow_mouse();
- antw = HndlDial(marken, 0, FALSE, NULL, NULL);
- Last_mouse();
- if (antw == MRKOK)
- {
- for (i=0; i<5; i++)
- if (get_select(marken,MRK1+i))
- break;
- objc_getstring(marken, MRKTXT1+i, name);
- set_marke(i, name, t_ptr->filename, t_ptr->ypos, t_ptr->xpos);
- }
- }
-
- /***************************************************************************/
- /* Verwaltung der Kürzel */
- /***************************************************************************/
-
-
- VOID clr_kurzel(VOID)
- {
- free_textring(&kurz);
- free_textring(&auto_kurz);
- krz_loaded = FALSE;
- }
-
- VOID do_kurzel(TEXTP t_ptr, BOOLEAN online)
- {
- BOOLEAN set_pos, save_insert;
- WORD xw, i, len;
- UBYTE *str, buffer[KRZ_MAX_LEN+1];
- LINEP col;
- RINGP k;
-
- if (online)
- k = &auto_kurz;
- else
- k = &kurz;
-
- if (ist_leer(k))
- return;
-
- xw = t_ptr->xpos;
- if (xw == 0)
- return;
- str = TEXT(t_ptr->cursor_line)+xw;
- i = 0;
- len = min(xw,KRZ_MAX_LEN);
- while (len>0) /* umdrehen */
- {
- buffer[i++] = *(--str);
- len--;
- }
- buffer[i] = EOS; /* abschliessen */
-
- /* longest Match */
- for (col=FIRST(k); TRUE; NEXT(col))
- {
- if (IS_TAIL(col))
- {
- if (!online) /* wenn man Auto-Kürzel hat, pings sonst bei */
- mybeep(); /* jedem Zeichen, das kein Kürzel ist! */
- return;
- }
- len = strncmp(buffer,KRZ_TXT(col),KRZ_LEN(col));
- if (len == 0)
- break;
- if (len > 0)
- {
- if (!online) /* dito. */
- mybeep();
- return;
- }
- }
-
- /*
- * Damit während der Kürzelexpandierung NICHT automatisch
- * eingerückt wird, merken wir uns die Einstellung und schalten es ab!
- * Kürzel, die mehrzeilig sind und mit Blanks/TABs beginnen, erscheinen
- * sonst nicht korrekt.
- */
- save_insert = t_ptr->loc_opt->einruecken;
- t_ptr->loc_opt->einruecken = FALSE;
-
- len = KRZ_LEN(col);
- if (overwrite)
- while ((--len)>=0) char_left(t_ptr);
- else
- while ((--len)>=0) char_bs(t_ptr);
- str = ERSATZ(col);
- set_pos = FALSE;
- for (i=col->len-(KRZ_MAX_LEN+2); (--i)>=0; )
- {
- if (*str == '^' && i > 0 && str[1] == '^')
- {
- char_cr(t_ptr);
- restore_edit(); /* sonst entstehen komische Effekte */
- xw++;
- str++;
- i--;
- }
- else if (*str!='~' || set_pos) /* das erste '~'-Zeichen zählt */
- {
- char_insert(t_ptr, *str);
- xw++;
- }
- else
- {
- set_pos = TRUE;
- xw = 0;
- }
- str++;
- }
- if (set_pos)
- while ((--xw)>=0) char_left(t_ptr);
-
- /*
- * Und wieder herstellen
- */
- t_ptr->loc_opt->einruecken = save_insert;
- }
-
- /* return 1 : kein Speicher mehr => abbruch */
- /* 0 : alles ok */
- WORD add_kurzel(LINEP col)
- {
- WORD len, i;
- UBYTE *str, buffer[260], *start;
- LINEP c;
- BOOLEAN online;
-
- krz_loaded = TRUE;
- if (col->len<2)
- return(0);
- if (col->len>MAX_LINE_LEN-KRZ_MAX_LEN)
- return(0);
- if (!ist_mem_frei())
- return (1);
- start = strchr(TEXT(col),'='); /* start zeigt auf Ersatztext */
- if (start==NULL)
- return(0);
- start++;
- /* WS am Anfang überspringen */
- for (str=TEXT(col); *str==' ' || *str=='\t'; str++) ;
- if (str[0]=='#' || str[0]=='=' ||
- (str[0]=='*' && str[1]=='='))
- return(0); /* Kommentarzeile oder kein Kurzel */
- len = 0;
- while (len<KRZ_MAX_LEN && *str!=' ' && *str!='\t' && *str!='=') /* Ende suchen */
- {
- len++; str++;
- }
- if (start[-2]=='*') /* auto. Kürzel */
- {
- online = TRUE;
- if (*str=='=')
- {
- str--;
- len--;
- }
- }
- else
- online = FALSE;
- buffer[0] = len; /* vorne Länge */
- i = 1;
- while (len>0) /* umdrehen */
- {
- buffer[i++] = *(--str);
- len--;
- }
- buffer[i] = EOS; /* abschliessen */
- len = (short) strlen(start);
- COPYB(buffer+KRZ_MAX_LEN+2,start,len);
- len += (KRZ_MAX_LEN+2);
-
- c = FIRST(&kurz);
- if (ist_leer(&kurz))
- INSERT(&c,0,len,buffer);
- else
- {
- while (!IS_TAIL(c) && strcmp(KRZ_TXT(c),buffer+1)>0)
- NEXT(c);
- col_insert(c->vorg,new_col_w(buffer,len));
- kurz.lines++;
- }
- if (online)
- {
- c = FIRST(&auto_kurz);
- if (ist_leer(&auto_kurz))
- INSERT(&c,0,len,buffer);
- else
- {
- while (!IS_TAIL(c) && strcmp(KRZ_TXT(c),buffer+1)>0)
- NEXT(c);
- col_insert(c->vorg,new_col_w(buffer,len));
- auto_kurz.lines++;
- }
- }
- return(0);
- }
-
- WORD load_kurzel(VOID)
- {
- LONG anz;
- RING t;
- LINEP lauf;
- WORD erg;
- LineEnding dummy;
-
- if (krz_name[0] == EOS)
- return 0;
-
- erg = 1;
- init_textring(&t);
- if (load_datei(krz_name, &t, FALSE, &dummy)==0)
- {
- anz = t.lines;
- lauf = FIRST(&t);
- if (anz)
- {
- clr_kurzel(); /* alte Kürzel löschen */
- while ((--anz)>=0)
- {
- if (add_kurzel(lauf)) break;
- NEXT(lauf);
- }
- }
- erg = 0;
- }
- kill_textring(&t);
- return erg;
- }
-
- VOID ch_kurzel(CONST UBYTE *name, BOOLEAN force_load)
- {
- if (name[0] == EOS)
- {
- clr_kurzel();
- krz_name[0] = EOS;
- return;
- }
- if ((strcmp(name, krz_name) != 0) || (force_load))
- {
- strcpy(krz_name, name);
- load_kurzel();
- }
- }
-